/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.resume.sinistre.om.impl;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Date;

import fr.generali.accueilclient.resume.role.om.impl.AbstractResumeRole;
import fr.generali.accueilclient.resume.sinistre.om.IResumeSinistre;

/**
 * @author a000cpu KHO
 */
public class ResumeSinistre extends AbstractResumeRole implements IResumeSinistre {

    /**
     * Statut des sinistres actifs
     */
    private static final String[] STATUT_SINISTRE_ACTIF = 
    {"01", "1", "04", "05", "06", "07", "09", "10", "11", "12", "13", "16", "17", "18", "19", "23", 
        "25", "30", "31" };

    /**
     * Le numero de contrat
     */
    private String numeroContrat;

    /**
     * numero sinistre compagnie
     */
    private String numeroSinistreCie;

    /**
     * Le numéro de client
     */
    private String numeroClient;

    /**
     * Couple bilan /nature du sinistre
     */
    private String bilanNature;

    /**
     * Date de survenance du sinistre
     */
    private Date dateSurvenance;

    /**
     * Date de declaration du sinistre
     */
    private Date dateDeclaration;

    /**
     * Date de cloture du sinistre
     */
    private Date dateCloture;

    /**
     * Statut du sinistre
     */
    private String statut;

    /**
     * Le code produit
     */
    private String codeProduitContrat;

    /**
     * Le libelle produit
     */
    private String libelleProduit;

    /**
     * Montant des règlements sinistre à l'assure Somme des règlements effectues
     * à l'assure (encaissements et paiements).
     */
    private BigDecimal reglementAssure;

    /**
     * La devise des règlements effectués à l'assuré
     */
    private String reglementAssureDevise;

    /**
     * Montant estime du sinistre à l'ouverture du dossier toutes garanties
     * confondues. Il s'agit de l'evaluation initiale.
     */
    private BigDecimal montantTotal;

    /**
     * Devise du montant total
     */
    private String montantTotalDevise;

    /**
     * Système d'origine du sinistre
     */
    private String systemeOrigineSinistre;

    /**
     * Système d'origine du contrat
     */
    private String systemeOrigineContrat;

    /**
     * Indique si le sinistre est géré :
     * <p>
     * <li>Au siège
     * <li>local
     */
    private String typeSiteGestion;

    /**
     * Indique la responsabilité ou non de l'assuré dans le sinistre :
     * <p>
     * <li>Aucune responsabilité
     * <li>Responsabilité partagée
     * <li>Responsabilité totale
     */
    private String responsabiliteSinistre;

    /**
     * Date de compétence du sinistre au format JJ.MM.AAAA
     */
    private Date dateCompetence;

    /**
     * Date DROC du sinistre au format JJ.MM.AAAA
     */
    private Date dateDROC;

    /**
     * Indique si le sinistre est grave :
     * <p>
     * <li>Minime
     * <li>Moyen
     * <li>Grave
     * <li>Très grave
     * <li>Décédé
     */
    private String indicateurSinistreGrave;

    /**
     * Précise le type de recours Ex : Droit commun corporel, Carambolage,
     * Recours titre 3,2,...
     */
    private String typeRecours;

    /**
     * Nombre recours subis
     */
    private String nbRecoursSubis;

    /**
     * Nombre recours exercés
     */
    private String nbRecoursExerces;

    /**
     * Nombre recours aboutis
     */
    private String nbRecoursAboutis;

    /**
     * N° immatriculation du véhicule
     */
    private String numeroImmatriculationVehicule;

    /**
     * Le code de la nature du sinistre
     */
    private String codeNature;

    /**
     * Le code de la société du contrat
     */
    private String codeSocieteContrat;

    /**
     * numero sinistre agent
     */
    private String numeroSinistreAgent;

    /**
     * Montant des règlements total à l'assure Somme des règlements effectues à
     * l'assure (encaissements et paiements).
     */
    private BigDecimal montantTotalDesReglements;

    /******************************* ACCESSEURS ***********************************/

    /**
     * @return the numeroContrat
     */
    public String getNumeroContrat() {
        return numeroContrat;
    }

    /**
     * @param numeroContrat the numeroContrat to set
     */
    public void setNumeroContrat(String numeroContrat) {
        this.numeroContrat = numeroContrat;
    }

    /**
     * @return the numeroSinistreCie
     */
    public String getNumeroSinistreCie() {
        return numeroSinistreCie;
    }

    /**
     * @param numeroSinistreCie the numeroSinistreCie to set
     */
    public void setNumeroSinistreCie(String numeroSinistreCie) {
        this.numeroSinistreCie = numeroSinistreCie;
    }

    /**
     * @return the bilanNature
     */
    public String getBilanNature() {
        return bilanNature;
    }

    /**
     * @param bilanNature the bilanNature to set
     */
    public void setBilanNature(String bilanNature) {
        this.bilanNature = bilanNature;
    }

    /**
     * @return the dateSurvenance
     */
    public Date getDateSurvenance() {
        return dateSurvenance;
    }

    /**
     * @param dateSurvenance the dateSurvenance to set
     */
    public void setDateSurvenance(Date dateSurvenance) {
        this.dateSurvenance = dateSurvenance;
    }

    /**
     * @return the dateDeclaration
     */
    public Date getDateDeclaration() {
        return dateDeclaration;
    }

    /**
     * @param dateDeclaration the dateDeclaration to set
     */
    public void setDateDeclaration(Date dateDeclaration) {
        this.dateDeclaration = dateDeclaration;
    }

    /**
     * @return the dateCloture
     */
    public Date getDateCloture() {
        return dateCloture;
    }

    /**
     * @param dateCloture the dateCloture to set
     */
    public void setDateCloture(Date dateCloture) {
        this.dateCloture = dateCloture;
    }

    /**
     * @return the statut
     */
    public String getStatut() {
        return statut;
    }

    /**
     * @param statut the statut to set
     */
    public void setStatut(String statut) {
        this.statut = statut;
    }

    /**
     * @return the codeProduit
     */
    public String getCodeProduitContrat() {
        return codeProduitContrat;
    }

    /**
     * @param codeProduitContrat the codeProduit to set
     */
    public void setCodeProduitContrat(String codeProduitContrat) {
        this.codeProduitContrat = codeProduitContrat;
    }

    /**
     * @return the libelleProduit
     */
    public String getLibelleProduit() {
        return libelleProduit;
    }

    /**
     * @param libelleProduit the libelleProduit to set
     */
    public void setLibelleProduit(String libelleProduit) {
        this.libelleProduit = libelleProduit;
    }

    /**
     * @return the reglementAssure
     */
    public BigDecimal getReglementAssure() {
        return reglementAssure;
    }

    /**
     * @param reglementAssure the reglementAssure to set
     */
    public void setReglementAssure(BigDecimal reglementAssure) {
        this.reglementAssure = reglementAssure;
    }

    public String getReglementAssureDevise() {
        return reglementAssureDevise;
    }

    public void setReglementAssureDevise(String reglementAssureDevise) {
        this.reglementAssureDevise = reglementAssureDevise;
    }

    /**
     * @return the montantTotal
     */
    public BigDecimal getMontantTotal() {
        return montantTotal;
    }

    /**
     * @param montantTotal the montantTotal to set
     */
    public void setMontantTotal(BigDecimal montantTotal) {
        this.montantTotal = montantTotal;
    }

    public String getMontantTotalDevise() {
        return montantTotalDevise;
    }

    public void setMontantTotalDevise(String montantTotalDevise) {
        this.montantTotalDevise = montantTotalDevise;
    }

    /**
     * @return the systemeOrigineSinistre
     */
    public String getSystemeOrigineSinistre() {
        return systemeOrigineSinistre;
    }

    /**
     * @param systemeOrigineSinistre the systemeOrigineSinistre to set
     */
    public void setSystemeOrigineSinistre(String systemeOrigineSinistre) {
        this.systemeOrigineSinistre = systemeOrigineSinistre;
    }

    /**
     * @return the typeSiteGestion
     */
    public String getTypeSiteGestion() {
        return typeSiteGestion;
    }

    /**
     * @param typeSiteGestion the typeSiteGestion to set
     */
    public void setTypeSiteGestion(String typeSiteGestion) {
        this.typeSiteGestion = typeSiteGestion;
    }

    /**
     * @return the responsabiliteSinistre
     */
    public String getResponsabiliteSinistre() {
        return responsabiliteSinistre;
    }

    /**
     * @param responsabiliteSinistre the responsabiliteSinistre to set
     */
    public void setResponsabiliteSinistre(String responsabiliteSinistre) {
        this.responsabiliteSinistre = responsabiliteSinistre;
    }

    /**
     * @return the dateCompetence
     */
    public Date getDateCompetence() {
        return dateCompetence;
    }

    /**
     * @param dateCompetence the dateCompetence to set
     */
    public void setDateCompetence(Date dateCompetence) {
        this.dateCompetence = dateCompetence;
    }

    /**
     * @return the dateDROC
     */
    public Date getDateDROC() {
        return dateDROC;
    }

    /**
     * @param dateDROC the dateDROC to set
     */
    public void setDateDROC(Date dateDROC) {
        this.dateDROC = dateDROC;
    }

    /**
     * @return the indicateurSinistreGrave
     */
    public String getIndicateurSinistreGrave() {
        return indicateurSinistreGrave;
    }

    /**
     * @param indicateurSinistreGrave the indicateurSinistreGrave to set
     */
    public void setIndicateurSinistreGrave(String indicateurSinistreGrave) {
        this.indicateurSinistreGrave = indicateurSinistreGrave;
    }

    /**
     * @return the typeRecours
     */
    public String getTypeRecours() {
        return typeRecours;
    }

    /**
     * @param typeRecours the typeRecours to set
     */
    public void setTypeRecours(String typeRecours) {
        this.typeRecours = typeRecours;
    }

    /**
     * @return the nbRecoursSubis
     */
    public String getNbRecoursSubis() {
        return nbRecoursSubis;
    }

    /**
     * @param nbRecoursSubis the nbRecoursSubis to set
     */
    public void setNbRecoursSubis(String nbRecoursSubis) {
        this.nbRecoursSubis = nbRecoursSubis;
    }

    /**
     * @return the nbRecoursExerces
     */
    public String getNbRecoursExerces() {
        return nbRecoursExerces;
    }

    /**
     * @param nbRecoursExerces the nbRecoursExerces to set
     */
    public void setNbRecoursExerces(String nbRecoursExerces) {
        this.nbRecoursExerces = nbRecoursExerces;
    }

    /**
     * @return the nbRecoursAboutis
     */
    public String getNbRecoursAboutis() {
        return nbRecoursAboutis;
    }

    /**
     * @param nbRecoursAboutis the nbRecoursAboutis to set
     */
    public void setNbRecoursAboutis(String nbRecoursAboutis) {
        this.nbRecoursAboutis = nbRecoursAboutis;
    }

    /**
     * @return the numeroImmatriculationVehicule
     */
    public String getNumeroImmatriculationVehicule() {
        return numeroImmatriculationVehicule;
    }

    /**
     * @param numeroImmatriculationVehicule the numeroImmatriculationVehicule to
     *            set
     */
    public void setNumeroImmatriculationVehicule(String numeroImmatriculationVehicule) {
        this.numeroImmatriculationVehicule = numeroImmatriculationVehicule;
    }

    public String getCodeNature() {
        return codeNature;
    }

    public void setCodeNature(String codeNature) {
        this.codeNature = codeNature;
    }

    public String getCodeSocieteContrat() {
        return codeSocieteContrat;
    }

    public void setCodeSocieteContrat(String codeSocieteContrat) {
        this.codeSocieteContrat = codeSocieteContrat;
    }

    /**
     * @return the numeroSinistreAgent
     */
    public String getNumeroSinistreAgent() {
        return numeroSinistreAgent;
    }

    /**
     * @param numeroSinistreAgent the numeroSinistreAgent to set
     */
    public void setNumeroSinistreAgent(String numeroSinistreAgent) {
        this.numeroSinistreAgent = numeroSinistreAgent;
    }

    /**
     * @return the montantTotalDesReglements
     */
    public BigDecimal getMontantTotalDesReglements() {
        return montantTotalDesReglements;
    }

    /**
     * @param montantTotalDesReglements the montantTotalDesReglements to set
     */
    public void setMontantTotalDesReglements(BigDecimal montantTotalDesReglements) {
        this.montantTotalDesReglements = montantTotalDesReglements;
    }

    /**
     * {@inheritDoc}
     */
    public String getNumeroClient() {
        return numeroClient;
    }

    /**
     * {@inheritDoc}
     */
    public void setNumeroClient(String numeroClient) {
        this.numeroClient = numeroClient;
    }

    /**
     * {@inheritDoc}
     */
    public String getSystemeOrigineContrat() {
        return systemeOrigineContrat;
    }

    /**
     * {@inheritDoc}
     */
    public void setSystemeOrigineContrat(String systemeOrigineContrat) {
        this.systemeOrigineContrat = systemeOrigineContrat;
    }

    /**
     * {@inheritDoc}
     */
    public String calculerCodeBilanSinistre() {
        StringBuilder codeSinistre = null;

        if (bilanNature != null && codeNature != null && codeSocieteContrat != null) {
            codeSinistre = new StringBuilder("");
            if (codeSocieteContrat != null) {
                codeSinistre.append(codeSocieteContrat);
            }
            if (bilanNature != null) {
                codeSinistre.append(bilanNature);
            }
            if (codeNature != null) {
                codeSinistre.append(codeNature);
            }
        }

        return codeSinistre != null ? codeSinistre.toString() : null;
    }

    /**
     * {@inheritDoc}
     */
    public boolean isActif() {
        return statut == null ? false : Arrays.asList(STATUT_SINISTRE_ACTIF).contains(statut.trim());
    }

}
